﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NicoView.Model.Service.Comments
{
    /// <summary>
    /// 部分テキスト情報タイプ
    /// </summary>
    public enum NicoCommentBodyTextType
    {
        /// <summary>
        /// URL
        /// </summary>
        Url,

        /// <summary>
        /// 動画番号
        /// </summary>
        VideoId,

        /// <summary>
        /// 生放送番号
        /// </summary>
        LiveId,

        /// <summary>
        /// コミュニティ番号
        /// </summary>
        CommunityId,

        /// <summary>
        /// 平文
        /// </summary>
        Plain,

        /// <summary>
        /// 改行
        /// </summary>
        LineBreak,

        /// <summary>
        /// 単独のアンカー
        /// </summary>
        SingleNoAnchor,

        /// <summary>
        /// 範囲指定されたアンカー
        /// </summary>
        RangeNoAnchor,

        /// <summary>
        /// HTML aタグ
        /// </summary>
        AnchorHtmlTag,

        /// <summary>
        /// 名前登録リクエスト
        /// </summary>
        NameRegistRequest,

        /// <summary>
        /// その他HTMLタグ
        /// </summary>
        HtmlTag,

        /// <summary>
        /// 放送主表示コマンド
        /// </summary>
        OwnerShowCommand,

        /// <summary>
        /// 表示しないコマンド
        /// </summary>
        NoneShowCommand,

        /// <summary>
        /// BSPコマンド
        /// </summary>
        BspCommand,

        /// <summary>
        /// そのたコマンド
        /// </summary>
        Command,

    }


    /// <summary>
    /// ニコニココメント部分テキストインターフェース
    /// </summary>
    /// <remarks>
    /// 各種情報取得用プロパティ及びメソッドはその値が有効かどうか判定してから取得すること
    /// 値が無効な状態で取得しようとすると例外が発生する
    /// </remarks>
    public interface INicoCommentBodyText
    {
        /// <summary>
        /// 部分テキストのURL部分を取得
        /// URLが有効でなければ例外が発生する
        /// </summary>
        /// <returns></returns>
        string AsUrl();

        /// <summary>
        /// このテキストに割り当てられている子テキストを取得
        /// 子テキストが有効でなければ例外が発生する
        /// </summary>
        ICollection<INicoCommentBodyText> ChildTexts { get; }

        /// <summary>
        /// URLを保持しているか判定
        /// </summary>
        bool HasUrl { get; }

        /// <summary>
        /// このテキストに割り当てられているユーザ名を取得
        /// ユーザ名が有効でなければ例外が発生する
        /// </summary>
        /// <returns></returns>
        string GetUserName();

        /// <summary>
        /// アンカーを取得
        /// アンカーが有効でなければ例外が発生する
        /// </summary>
        /// <returns></returns>
        int GetAnchor();

        /// <summary>
        /// 範囲アンカーを取得
        /// アンカーが有効でなければ例外が発生する
        /// </summary>
        /// <returns></returns>
        Tuple<int, int> GetRangeAnchor();

        
        /// <summary>
        /// このテキストの部分テキストタイプを取得
        /// </summary>
        NicoCommentBodyTextType BodyType { get; }


        /// <summary>
        /// 文章を保持しているか判定
        /// </summary>
        bool HasCurrentBodyText { get; }


        /// <summary>
        /// 子文章を保持しているか判定
        /// </summary>
        bool HasChildBodyTexts { get; }

        /// <summary>
        /// ユーザ名を保持しているか判定
        /// </summary>
        bool HasUserName { get; }


        /// <summary>
        /// コマンドであるか判定
        /// </summary>
        bool IsCommand { get; }

        /// <summary>
        /// ユーザが使用する表示コマンドであるか
        /// </summary>
        bool IsUserShowCommand { get; }

        /// <summary>
        /// 
        /// </summary>
        bool IsOwnerShowCommand { get; }

        /// <summary>
        /// このテキストに割り当てられているテキストを取得
        /// テキストが有効でなければ例外が発生する
        /// </summary>
        string Text { get; }

        /// <summary>
        /// 表示用テキストを取得
        /// テキストが有効でなければ例外が発生する
        /// </summary>
        string DisplayText { get; }

        
    }



}
